<?php

namespace SGBD\Persistance;

/**
 * Une classe qui represents l'interface entre le couche BD et
 * l'application. Toutes les operations sur le BD passe par cette methode.
 */
interface iDB
{

    public function beginTransaction();
    public function commit();
    public function rollback();


    /**
     * getAllClubs
     *
     * returns une tableau de tableaus, ou chaque tableau interieur represents
     * une ligne de la relation Club, avec les attributes calcules suivants
     * ajoutees:
     *
     *  * gagnes: matches gagnes en saison donne
     *  * egals: matches egals en saison donne
     *  * perdus: matches perdus en saison donne
     *
     * @param $orderBy
     *   trier de ce champs, qui est en attribut en Clubs ou un attribute
     *   calculee.
     * @param $saison
     *   array(saison-debut, saison-fin) ou FALSE pour aucun saison particuliar,
     *   exp array(2011, 2012)
     * @return array
     */
    public function getAllClubs($orderBy, $saison);

    /**
     * updateClub
     *
     * @param $nomClub
     * @param $adress
     * @return boolean
     */
    public function updateClub($nomClub);

    /**
     * createClub
     *
     * @param $nomClub
     * @param $adress
     * @return boolean
     */
    public function createClub($nomClub);

    /**
     * deleteClub
     *
     * @param $nomClub
     * @return boolean
     */
    public function deleteClub($nomClub);

    /**
     * getClub
     *
     * Retourns un array qui represent une ligne de la tableau Club.
     *
     * @param $numeroEquip
     * @return array
     */
    public function getClub($nomClub);

    /**
     * getBureauClub
     *
     * Retourns un array contenant des arrays qui represent une ligne dans la
     * tableau Personne, avec le Role etc.
     *
     * @param $nomClub
     * @return array
     */
    public function getBureauClub($nomClub);

    // Operations sur la table Adhesion

    /**
     * createAdhesion
     *
     * Ajout Personne comme fonctionnaire du bureau de Club, avec role.
     *
     * @param $nomClub
     * @param $numeroPersonne
     * @param $role
     * @return boolean
     */
    public function createAdhesion($nomClub,  $numeroPersonne, $role);

    /**
     * deleteAdhesion
     *
     * On a pas besoin de donner le numero de club parce que une personne
     * peut pas etre adherent dans plusieurs clubs.
     *
     * @param $numeroPersonne
     * @return boolean
     */
    public function deleteAdhesion($numeroPersonne);

    // Operations sur la table Joueur

    /**
     * getAllJoueursParCategorie
     *
     * @param $nomCategorie
     * @param $saison
     * @return Array(Array:(Joueur + Personne))
     */
    //public function getAllJoueursParCategorie($nomCategorie, $saison, $numeroEquipe);

    /**
     * getAllJoueursParEquipe
     *
     * Donne tout jouers d'un equip par un saison particulaire.
     *
     * @param $numEquipe
     * @param $saison
     * @return Array(Array:(Joueur + Personne))
     */
    public function getAllJoueursParEquipe($numEquipe, $saison);

    /**
     * getAllJoueursParClub
     *
     * Donne tout jouers d'un equip par d'un club particulier
     *
     * @param $noClub
     * @param $saison
     * @return Array(Array:(Joueur + Personne))
     */
    public function getAllJoueursParClub($nomClub, $saison);

    /**
     * getJoueur
     *
     * Donne un joueur
     *
     * @param $numeroLicense
     * @return Array:(Joueur + Personne)
     */
    public function getJoueur($numeroPersonne);

    /**
     * updateJoueur
     *
     * doit faire un update sur Personne aussi.
     *
     * @param $numeroLicense
     * @param $numeroPersonne
     * @param $nom
     * @param $prenom
     * @param $adresse
     * @param $dateNaissance
     * @return boolean
     */
    public function updateJoueur($numeroLicense, $numeroPersonne, $nom, $prenom, $adresse, $dateNaissance,$numeroEquipe);

	 /**
     * transferJoueur
     *
     * @param $numeroPersonne
     * @param $numeroEquipe
     * @return boolean
     */
    public function transferJoueur($numeroPersonne,$numeroEquipe);

    /**
     * createJoueur
     *
     * doit faire un update sur Personne aussi.
     *
     * @param $numeroLicense
     * @param $numeroPersonne
     * @param $nom
     * @param $prenom
     * @param $adresse
     * @param $dateNaissance
     * @return boolean
     */
    public function createJoueur(
        $numeroLicense, $nom, $prenom, $adresse, $dateNaissance,$numeroEquipe
    );

    /**
     * deleteJoueur
     *
     * doit faire un delete sur Personne aussi.
     *
     * @param $numeroLicense
     * @return boolean
     */
    public function deleteJoueur($numeroPersonne);



    /**
     * ajoutJoueurEnEquipe
     *
     * ajoute le joueur avec $numeroLicence a l'equipe avec $numeroEquipe.
     *
     * @param $numeroLicense
     * @param $numeroEquipe
     */
    public function ajoutJoueurEnEquipe($numeroLicense, $numeroEquipe);

    /**
     * getAllCategories
     *
     * Operations sur la table Categorie.
     *
     * @param
     * @return Array(Array:Categorie)
     */
    public function getAllCategories();

    /**
     * getAllCategoriesDeClub
     *
     * donne toutes les categorie d'un club (le categories de tout ses equipes)
     *
     * @param $nomClub
     * @return Array(Array:Categorie)
     */
    public function getAllCategoriesDeClub($nomClub);

    // Operations sur la table Equip

    /**
     * getEquipe
     *
     * @param
     * @return Array:Equipe
     */
    public function getEquipe($numeroEquipe);

    /**
     * getAllEquipes
     *
     * @param $orderBy
     * @param $saison
     */
    public function getAllEquipes($orderBy, $saison);


    /**
     * getAllEquipesDeClub
     *
     * @param $nomClub
     * @return Array(Array:Equipe)
     */
    public function getAllEquipesDeClub($nomClub);

    /**
     * updateEquipe
     *
     * @param $numeroEquipe
     * @param $nomEquipe
     * @return boolean
     */
    public function updateEquipe($numeroEquipe, $nomEquipe);

    /**
     * createEquipe
     *
     * @param $numeroEquipe
     * @param $nomClub
     * @param $categorie
     * @param $nomEquipe
     * @return boolean
     */
    public function createEquipe($nomClub, $categorie, $nomEquipe);

    /**
     * deleteEquipe
     *
     * @param $numeroEquipe
     * @return boolean
     */
    public function deleteEquipe($numeroEquipe);

    // Operations sur la table Personne


    /**
     * getAllPersonnes
     *
     * Retourns une liste avec toutes les personnes dans la BD.
     *
     * @return Array(Array:Personne)
     */
    public function getAllPersonnes($orderBy);

    /**
     * getAllPersonnesLibre
     *
     * Retourns une liste avec toutes les personnes dans la BD.
     *
     * @return Array(Array:Personne)
     */
    public function getAllPersonnesLibre($orderBy);

    /**
     * getPersonne
     *
     * @param $numeroPersonne
     * @return Array:Personne
     */
    public function getPersonne($numeroPersonne);

    /**
     * createPersonne
     *
     * @param $nom
     * @param $prenom
     * @param $adresse
     * @param $dateNaissance
     * @return int le numero de personne qui a ete cree
     */
    public function createPersonne(
        $nom, $prenom, $adresse, $dateNaissance
    );

    /**
     * updatePersonne
     *
     * @param $numeroPersonne
     * @param $nom
     * @param $prenom
     * @param $adresse
     * @param $dateNaissance
     * @return boolean
     */
    public function updatePersonne(
        $numeroPersonne, $nom, $prenom, $adresse, $dateNaissance
    );


    /**
     * deletePersonne
     *
     * @param $numeroPersonne
     * @return boolean
     */
    public function deletePersonne($numeroPersonne);

    // Operations sur la table Match

    /**
     * getAllMatches
     *
     * @param $nomCategorie
     * @param $saison
     * @return Array(Array: Match + Equipe 1 + Equipe 2)
     */
    public function getAllMatches($nomCategorie, $saison);

    /**
     * getMatchFeuille
     *
     * Toutes les buts, le personnes, les equips, je ne sais pas ;)
     *
     * @param $numeroMatch
     * @return ?
     */
    public function getMatchFeuille($numeroMatch);

    // Operations general, qui ne appartient a une table particuliare

    /**
     * getEquipsClassement
     *
     * @param $nomCategorie
     * @param $saison
     * @return ClassementEquips
     */
    public function getEquipsClassement($nomCategorie, $saison);

	/**
	*getEntraineursEquipe
	* @param $numeroEquipe
	* @return EntraineursEquipe	
	*/
	public function getEntraineursEquipe($numeroEquipe);
	
	/**
     * createEntraineur
     *
     * doit faire un insert sur Personne aussi.
     *
     * @param $nom
     * @param $prenom
     * @param $adresse
     * @param $dateNaissance
     * @param $numeroEquipe
     * @param $dateEntree
     * @return boolean
     */
    public function createEntraineur($nom, $prenom, $adresse, $dateNaissance,$numeroEquipe,$dateEntree);

    /**
     * deleteEntraineur
     * 
     * @param $numeroPersonne
     */

    public function deleteEntraineur($numeroPersonne);

	/**
     * createHistoriqueJoueur
     *
     * @param $numeroEquipe
     * @param $numeroPersonne
     * @param $dateEntree
     */
    public function createHistoriqueJoueur($numeroPersonne,$numeroEquipe,$dateEntree);

	/** 
	*getHistoriqueJoueur
	* @param $numeroPersonne
	* @return HistoriqueJoueur	
	*/
	public function getHistoriqueJoueur($numeroPersonne);
    
        /** 
	*setTitulaireJoueur
	* @param $numeroJoueur
	* @param $numeroRencontre	
	*/
	public function setTitulaireJoueur($numeroPersonne,$numeroRencontre);

        
	/** 
	*getPerformanceJoueur
	* @param $numeroRencontre
	* @return array performance	
	*/
	public function getPerformanceJoueur($numeroRencontre);

	  /** 
	*setPointJoueur
	* @param $numeroJoueur
	* @param $numeroRencontre	
	*/
	public function setPointJoueur($numeroPersonne,$numeroRencontre,$point);
        
          /** 
	*setFauteJoueur
	* @param $numeroJoueur
	* @param $numeroRencontre	
	*/
	public function setFauteJoueur($numeroPersonne,$numeroRencontre);

	/** 
	*CreateRencontre
	* @param $numeroEquipeDomicile
    * @param $numeroEquipeVisiteur
	* @param $dateRencontre	
	*/
	public function createRencontre($numeroEquipeDomicile,$numeroEquipeVisiteur,$dateRencontre);

        /** 
	*getMoyennePointsRencontre
        * @param $nomCategorie
	* @param $dateRencontre	
        * @return array 
	*/
	public function getMoyennePointsRencontre($nomCategorie,$dateRencontre);
       
        /** 
	*getMoyennePointsRencontreSaison
        * @param $nomCategorie	
        * @return array 
	*/
	public function getMoyennePointsRencontreSaison($nomCategorie, $saison);
    
         
        /** 
	*getMoyennePointsJoueur
        * @param $numeroJoueur
        * @param $dateRencontre
        * @param $categorie
        * @return array 
	*/
	public function getMoyennePointsJoueur($dateRencontre,$categorie);

	/** 
	*getScoreEquipe
        * @param $numeroEquipe
        * @param $numeroRencontre
        * @return array 
	*/
	public function getScoreEquipe($numeroEquipe,$numeroRencontre);

    /**
     * getRencontre
     * 
     * @param $numeroRencontre
     */
	public function getRencontre($numeroRencontre);

    public function getDatesCategorie($nomCategorie);
}